home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / amiga / uae-0.7.0b2 / src / md-68k / m68k.h < prev    next >
C/C++ Source or Header  |  1998-01-20  |  3KB  |  87 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * MC68000 emulation - machine dependent bits
  5.   *
  6.   * Copyright 1996 Bernd Schmidt, Samuel Devulder
  7.   */
  8.  
  9.  
  10. struct flag_struct {
  11.     /* tricky: be sure that bit-offset(x)=bit-offset(c) in word representation. */
  12.     /* This depends heavily on the bit-order and the compiler used. I am not    */
  13.     /* sure the generated code is better than uae-0.6.1 */
  14.     int :12;           /* First word */
  15.     unsigned int n:1;
  16.     unsigned int z:1;
  17.     unsigned int v:1;
  18.     unsigned int c:1;
  19.     
  20.     int :15;           /* Second word */
  21.     unsigned int x:1;
  22. };
  23.  
  24. extern struct flag_struct regflags;
  25.  
  26. #define ZFLG (regflags.z)
  27. #define NFLG (regflags.n)
  28. #define CFLG (regflags.c)
  29. #define VFLG (regflags.v)
  30. #define XFLG (regflags.x)
  31.  
  32. static __inline__ int cctrue(const int cc)
  33. {
  34.     switch(cc){
  35.      case 0: return 1;                       /* T */
  36.      case 1: return 0;                       /* F */
  37.      case 2: return !CFLG && !ZFLG;          /* HI */
  38.      case 3: return CFLG || ZFLG;            /* LS */
  39.      case 4: return !CFLG;                   /* CC */
  40.      case 5: return CFLG;                    /* CS */
  41.      case 6: return !ZFLG;                   /* NE */
  42.      case 7: return ZFLG;                    /* EQ */
  43.      case 8: return !VFLG;                   /* VC */
  44.      case 9: return VFLG;                    /* VS */
  45.      case 10:return !NFLG;                   /* PL */
  46.      case 11:return NFLG;                    /* MI */
  47.      case 12:return NFLG == VFLG;            /* GE */
  48.      case 13:return NFLG != VFLG;            /* LT */
  49.      case 14:return !ZFLG && (NFLG == VFLG); /* GT */
  50.      case 15:return ZFLG || (NFLG != VFLG);  /* LE */
  51.     }
  52.     abort();
  53.     return 0;
  54. }
  55.  
  56. /* sam: MIT or MOTOROLA syntax ? */
  57. #ifdef __linux__
  58. #define MITMOT(mit,mot) mot
  59. #else /* Amiga os */
  60. #define MITMOT(mit,mot) mit
  61. #endif
  62.  
  63. #define m68k_flag_tst(l, v)                                           \
  64.   __asm__ __volatile__(MITMOT("tst"#l" %0\n\tmovew ccr,_regflags",    \
  65.                               "tst."#l" %0\n\tmove.w %%ccr,regflags") \
  66.                               : : "dmi" (v) : "cc")
  67.  
  68. #define m68k_flag_add(l, v, s, d)                                  \
  69.   __asm__ __volatile__(MITMOT("add"#l" %3,%1\n\tmovew ccr,%0",     \
  70.                               "add."#l" %3,%1\n\tmove.w %%ccr,%0") \
  71.                        : "=d" (ccr), "=&d" (v)                     \
  72.                        : "1" (s), "dmi" (d)                        \
  73.                        : "cc")
  74.  
  75. #define m68k_flag_sub(l, v, s, d)                                  \
  76.   __asm__ __volatile__(MITMOT("sub"#l" %2,%1\n\tmovew ccr,%0",     \
  77.                               "sub."#l" %2,%1\n\tmove.w %%ccr,%0") \
  78.                        : "=d" (ccr), "=&d" (v)                     \
  79.                        : "dmi" (s), "1" (d)                        \
  80.                        : "cc")
  81.  
  82. #define m68k_flag_cmp(l, s, d)                                           \
  83.   __asm__ __volatile__(MITMOT("cmp"#l" %0,%1\n\tmovew ccr,_regflags",    \
  84.                               "cmp."#l" %0,%1\n\tmove.w %%ccr,regflags") \
  85.                        : : "dmi" (s), "d" (d) : "cc")
  86.  
  87.